package com.cskaoyan.shopping.service.impl;

import com.cskaoyan.mall.dto.ItemDto;
import com.cskaoyan.mall.dto.ProductDetailDto;
import com.cskaoyan.mall.dto.ProductDto;
import com.cskaoyan.shopping.constants.GlobalConstants;
import com.cskaoyan.shopping.converter.ContentConverter;
import com.cskaoyan.shopping.converter.ProductConverter;
import com.cskaoyan.shopping.dal.entitys.*;
import com.cskaoyan.shopping.dal.persistence.*;
import com.cskaoyan.shopping.dto.AllProductResponse;
import com.cskaoyan.shopping.dto.PanelDto;
import com.cskaoyan.shopping.form.PageRequest;
import com.cskaoyan.shopping.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import javax.validation.constraints.NotNull;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Service
public class IProductServiceImpl implements IProductService {

    @Autowired
    ItemMapper itemMapper;
    @Autowired
    ItemDescMapper itemDescMapper;
    @Autowired
    ItemStockMapper itemStockMapper;
    @Autowired
    ProductConverter productConverter;

    /**
     * 获取商品详情信息
     *
     * @param id
     * @return com.cskaoyan.mall.dto.ProductDetailDto
     * @author mabai
     * @since 2022/10/25 21:37起开始实现该功能
     */
    @Override
    public ProductDetailDto getProductDetail(Long id) {
        // TODO:重构前的版本
        // // 查询tb_item中的信息
        // Item item = itemMapper.selectByPrimaryKey(id);
        // ProductDetailDto productDetailDto = null;
        // // 如果输入的商品id查不到数据返回空数据
        // if (item != null) {
        //     // 查询tb_stock中的stock_count字段映射Dto中的limitNum数据
        //     ItemStock itemStock = itemStockMapper.selectByPrimaryKey(id);
        //     // Dto中需要的limitNum数据
        //     Long limitNum = itemStock.getStockCount();
        //     // 查询tb_item_desc中的item_desc字段映射Dto中的detail数据
        //     ItemDesc itemDesc = itemDescMapper.selectByPrimaryKey(id);
        //     String detail = itemDesc.getItemDesc();
        //     // Item、ItemStock、ItemDesc ——> ProductDetailDto
        //     productDetailDto = new ProductDetailDto();
        //     productDetailDto.setDetail(detail);
        //     productDetailDto.setLimitNum(limitNum);
        //     productDetailDto.setProductId(id);
        //     productDetailDto.setSalePrice(item.getPrice());
        //     productDetailDto.setProductName(item.getTitle());
        //     productDetailDto.setSubTitle(item.getSell_point());
        //     productDetailDto.setProductImageBig(item.getImageBig());
        //     String[] images = item.getImages();
        //     List<String> imagesList = Arrays.asList(images);
        //     productDetailDto.setProductImageSmall(imagesList);
        // }
        // return productDetailDto;
        // TODO：2022-10-27 21点23分重构后的代码
        // 查出商品详情所需信息
        Item item = itemMapper.selectByPrimaryKey(id);
        ItemDesc itemDesc = itemDescMapper.selectByPrimaryKey(id);
        // 将数据库查询结果转化为DTO
        return productConverter.toProductDetailDto(item, itemDesc);
    }

    /**
     * 分页查询商品列表
     *
     * @param pageInfo page页码、size每页条数、sort是否排序、priceGt价格最小值、priceLte价格最大值、cid所属分类
     * @return com.cskaoyan.shopping.dto.AllProductResponse
     * @author mabai
     * @since 2022/10/26 16:05
     */
    @Override
    public AllProductResponse getAllProduct(PageRequest pageInfo) {
        // TODO：重构前的代码
        /*Long cid = pageInfo.getCid();
        String sort = pageInfo.getSort();
        String orderCol = "price";
        String orderDir = "desc";
        // 判断是否排序
        switch (sort) {
            // sort为1表示按照价格升序
            case "1":
                orderDir = "asc";
                break;
            // sort为-1表示按照价格降序
            case "-1":
                orderDir = "desc";
                break;
            // sort为空默认按照新增时间降序排列
            case "":
                orderCol = "created";
                orderDir = "desc";
                break;
        }
        List<Item> items = itemMapper.selectItemFront(cid, orderCol, orderDir, pageInfo.getPriceGt(), pageInfo.getPriceLte());
        // List<Item> items = itemMapper.selectItemFront(orderCol, orderDir, pageInfo);
        // 用stream流实现分页功能
        List<Item> collect = items.stream()
                .skip((pageInfo.getPage() - 1) * (pageInfo.getSize())) // 表示跳过当前页之前的数据，
                .limit(pageInfo.getSize())// 过滤出当前页面size数量的数据
                .collect(Collectors.toList());

        // List<ProductDto> productDtos = productConverter.items2Dto(items);
        // 将分页后的Do对象转化为Dto对象
        List<ProductDto> productDtos = productConverter.items2Dto(collect);
        AllProductResponse allProductResponse = new AllProductResponse();
        allProductResponse.setData(productDtos);
        // 商品总记录数
        allProductResponse.setTotal((long) items.size());
        return allProductResponse;*/
        // TODO：2022-10-27 21点23分重构后的代码
        // 创建一个返回值容器
        AllProductResponse result = new AllProductResponse();
        // 创建条件查询对象
        Example itemExample = new Example(Item.class);
        // 设置排序
        String sort = pageInfo.getSort();
        if (sort != null) {
            switch (sort) {
                case "1":
                    // 如果sort值为1，则按照价格升序排
                    itemExample.setOrderByClause("price asc");
                    break;
                case "-1":
                    // 如果sort值为-1，则按照价格降序排
                    itemExample.setOrderByClause("price desc");
                    break;
                case "":
                    // 如果sort值为空""默认按照商品创建时间从新到旧排序
                    itemExample.setOrderByClause("created desc");
                    break;
            }
        }
        // 根据动态条件查询
        Example.Criteria criteria = itemExample.createCriteria();
        if (!Objects.isNull(pageInfo.getPriceGt())) {
            // 如果价格最小值不为空则添加查询条件为价格不低于价格最小值
            criteria.andGreaterThan("price", pageInfo.getPriceGt());
        }
        if (!Objects.isNull(pageInfo.getPriceLte())) {
            // 如果价格最大值不为空则添加查询条件为价格不高于价格最大值
            criteria.andLessThan("price", pageInfo.getPriceLte());
        }
        if (!Objects.isNull(pageInfo.getCid())) {
            // 如果类目id不为空则追加查询条件为cid = ?的条件
            criteria.andEqualTo("cid", pageInfo.getCid());
        }

        // limit ? offset ? limit表示筛选的记录数，offset表示跳过的记录数
        // limit #{当前页面显示的记录数量},#{跳过当前显示页面记录的数量} limit #{size},#{(page-1)*size}
        @NotNull Integer page = pageInfo.getPage();
        @NotNull Integer size = pageInfo.getSize();
        int offset = ((page - 1) * size);
        // TODO:在数据库中直接实现分页功能，在数据库中查当前页面的记录数
        // RowBounds rowBounds = new RowBounds(offset, pageInfo.getSize());
        // // 执行sql获取Do对象
        // List<Item> items = itemMapper.selectByExampleAndRowBounds(itemExample, rowBounds);
        // TODO:在数据库中查询所有记录，在service层用stream流实现分页功能
        List<Item> items = itemMapper.selectByExample(itemExample);
        // 先过滤当前页面的数据记录
        List<Item> afterFilterItems = items.stream()
                .skip(offset) // 表示跳过当前页之前的数据量
                .limit(size) // 表示过滤出当前页的数据量
                .collect(Collectors.toList()); // 生成过滤后的Do对象
        // 再将过滤后的Do对象转化为Dto对象
        List<ProductDto> productDtos = productConverter.items2Dto(afterFilterItems);
        result.setTotal((long) items.size());
        result.setData(productDtos);
        return result;
    }

    @Autowired
    PanelMapper panelMapper;
    @Autowired
    PanelContentMapper panelContentMapper;
    @Autowired
    ContentConverter contentConverter;

    /**
     * 获取推荐模块商品（重构版）
     * TODO：2022-10-27 21点23分重构后的代码
     * @return java.util.Set<com.cskaoyan.shopping.dto.PanelDto>
     * @author mabai
     * @since 2022/10/27 21:16
     */
    @Override
    public Set<PanelDto> getRecommendGoods() {
        // 创建封装返回值的数据容器
        Set<PanelDto> result = new LinkedHashSet<>();
        // 根据推荐板块的id查询出推荐板块的商品列表
        List<Panel> panels = panelMapper.selectPanelContentById(GlobalConstants.RECOMMEND_PANEL_ID);
        // 查询出推荐板块中的详情内容信息
        List<PanelContentItem> panelContentItems = panelContentMapper.selectPanelContentAndProductWithPanelId(GlobalConstants.RECOMMEND_PANEL_ID);
        for (Panel panel : panels) {
            panel.setPanelContentItems(panelContentItems);
            // Do -> Dto
            PanelDto panelDto = contentConverter.panel2Dto(panel);
            result.add(panelDto);
        }
        return result;
    }

    //@Override
    // public List<ItemDto> getAllItems() {
    //  return null;
    //}
}
